 package srdb.migration.dbhandler.enterprisedb;
 
 import java.sql.SQLException;
 import java.sql.Struct;

 import srdb.migration.common.IMTKConnection;
import srdb.migration.common.MTKConstants;
import srdb.migration.dbhandler.srdb.SRDBBridge;
 import srdb.migration.schema.metadata.Table;

 import com.edb.util.PGInterval;

 public class RedwoodBridge extends SRDBBridge
 {
   public RedwoodBridge(IMTKConnection srcConn, IMTKConnection targetConn)
   {
     super(srcConn, targetConn);
   }
 
   public long setTableData(Table table, int batchSize, MTKConstants.DATABASE_TYPE sourceDBType, MTKConstants.DATABASE_TYPE targetDBType) throws Exception
   {
	return 0; //N/A
//     this.lastMigratedDataSize = 0L;
//     long committedRowCount = 0L;
//     boolean lastBatchFailure = false;
//     Connection _edbConn = null;
//     boolean defaultAutoCommitMode = false;
// 
//     PreparedStatement insertStmt = null;
//     Statement sourceStmt = null;
//     Statement destStmt = null;
//     ResultSet rs = null;
//     String insertStr = "";
//     File f = null;
//     FileOutputStream fos = null;
//     FileInputStream fis = null;
// 
//     FileInputStream[] arrFis = new FileInputStream[table.getLargeObjectsColumnCount() * batchSize];
//     BufferedReader[] arrBr = new BufferedReader[table.getCLOBColumnCount() * batchSize];
// 
//     ByteArrayInputStream[] arrBis = new ByteArrayInputStream[table.getLargeObjectsColumnCount() * batchSize];
//     int fisIndex = 0;
//     int bisIndex = 0;
//     int brIndex = 0;
//     for (int i = 0; i < arrFis.length; i++) {
//       arrFis[i] = null;
//       arrBis[i] = null;
//     }
// 
//     for (int i = 0; i < arrBr.length; i++) {
//       arrBr[i] = null;
//     }
// 
//     int j = 0;
// 
//     String fileNamePrefix = Utility.getValidFileNamePrefixFor(table.getParentSchema().getName(), table.getName());
//     try {
//       this.targetConn.getConnection().setAutoCommit(false);
//       insertStr = "INSERT INTO " + table.getTargetSchemaQualifiedName() + " VALUES (";
//       for (int i = 0; i < table.getColumns().size(); i++) {
//         insertStr = insertStr + "?";
//         if (i < table.getColumns().size() - 1)
//           insertStr = insertStr + ", ";
//       }
//       insertStr = insertStr + ");";
//       insertStmt = this.targetConn.getConnection().prepareStatement(insertStr);
// 
//       destStmt = this.targetConn.getConnection().createStatement();
// 
//       if ((table.isPartitioned()) && (!MigrationToolkit.isMemberOfPartitionTableList(table)))
//         destStmt.execute("DELETE FROM " + table.getTargetSchemaFullyQualifiedName(MTKConstants.DATABASE_TYPE.ORACLE, MTKConstants.DATABASE_TYPE.ENTERPRISEDB, false));
//       else {
//         destStmt.execute("TRUNCATE TABLE " + table.getTargetSchemaFullyQualifiedName(MTKConstants.DATABASE_TYPE.ORACLE, MTKConstants.DATABASE_TYPE.ENTERPRISEDB, false));
//       }
// 
//       destStmt.execute("update sr_catalog.sr_class set relhasindex = 'f' where oid = '" + table.getTargetSchemaFullyQualifiedName(MTKConstants.DATABASE_TYPE.ORACLE, MTKConstants.DATABASE_TYPE.ENTERPRISEDB, true) + "'::sr_catalog.regclass");
// 
//       this.targetConn.commit();
// 
//       sourceStmt = this.srcConn.getConnection().createStatement();
// 
//       if (((this.srcConn instanceof EnterpriseDBConnection)) || ((this.srcConn instanceof SRDBConnection))) {
//         _edbConn = this.srcConn.getConnection();
//         defaultAutoCommitMode = _edbConn.getAutoCommit();
//         _edbConn.setAutoCommit(false);
// 
//         sourceStmt.setFetchSize(100);
//       }
// 
//       rs = sourceStmt.executeQuery(table.getSelectSQL());
// 
//       while (rs.next()) {
//         for (int i = 0; i < table.getColumns().size(); i++) {
//           Column column = table.getColumns().get(i);
// 
//           switch (1.$SwitchMap$com$edb$schema$metadata$Column$DataType[table.getColumns().get(i).getDataType().ordinal()])
//           {
//           case 1:
//           case 2:
//           case 3:
//           case 4:
//             if ((column.isClob()) || (column.isNClob())) {
//               this.redwoodLobHandler.processClob(rs, i, fileNamePrefix, brIndex++, arrBr, insertStmt);
//             }
//             else if (MigrationToolkit.replaceNullChar()) {
//               String colValue = rs.getString(i + 1);
// 
//               if (colValue != null) {
//                 colValue = colValue.replaceAll("", String.valueOf(MigrationToolkit.nullReplacementChar()));
//               }
// 
//               insertStmt.setString(i + 1, colValue);
//             }
//             else
//             {
//               insertStmt.setString(i + 1, rs.getString(i + 1) != null ? rs.getString(i + 1).replaceAll("", "") : null);
//             }
// 
//             break;
//           case 5:
//             if (MigrationToolkit.replaceNullChar()) {
//               String colValue = rs.getString(i + 1);
// 
//               if (colValue != null) {
//                 colValue = colValue.replaceAll("", String.valueOf(MigrationToolkit.nullReplacementChar()));
//               }
// 
//               insertStmt.setObject(i + 1, colValue, 1111);
//             }
//             else
//             {
//               insertStmt.setObject(i + 1, rs.getString(i + 1) != null ? rs.getString(i + 1).replaceAll("", "") : null, 1111);
//             }
//             break;
//           case 6:
//             if (rs.getObject(i + 1) != null)
//               insertStmt.setDouble(i + 1, rs.getDouble(i + 1));
//             else {
//               insertStmt.setNull(i + 1, 6);
//             }
// 
//             break;
//           case 7:
//           case 8:
//           case 9:
//             Object objVal = rs.getObject(i + 1);
// 
//             if ((column.isReal()) || (column.isBinaryFloat())) {
//               if (objVal != null)
//                 insertStmt.setFloat(i + 1, rs.getFloat(i + 1));
//               else
//                 insertStmt.setNull(i + 1, 6);
//             }
//             else if (column.isDouble()) {
//               if (objVal != null)
//                 insertStmt.setDouble(i + 1, rs.getFloat(i + 1));
//               else {
//                 insertStmt.setNull(i + 1, 8);
//               }
//             }
//             else if (objVal != null)
//               insertStmt.setBigDecimal(i + 1, rs.getBigDecimal(i + 1));
//             else {
//               insertStmt.setNull(i + 1, 2);
//             }
// 
//             break;
//           case 10:
//           case 11:
//             insertStmt.setTimestamp(i + 1, rs.getTimestamp(i + 1));
//             break;
//           case 12:
//             if (column.isBlob()) {
//               fisIndex = this.redwoodLobHandler.processBlob(rs, i, fileNamePrefix, fisIndex, arrFis, insertStmt);
//             } else {
//               byte[] b = rs.getBytes(i + 1);
//               if (b != null) {
//                 this.lastMigratedDataSize += b.length;
// 
//                 arrBis[bisIndex] = new ByteArrayInputStream(b);
//                 insertStmt.setBinaryStream(i + 1, arrBis[(bisIndex++)], b.length);
//               }
//               else {
//                 insertStmt.setNull(i + 1, -2);
//               }
//             }
//             break;
//           case 13:
//             PGInterval pgInterval = null;
//             String intervalValue = rs.getString(i + 1);
// 
//             if (intervalValue != null) {
//               pgInterval = getPGIntervalObject(intervalValue);
// 
//               this.lastMigratedDataSize += pgInterval.toString().getBytes().length;
//             }
// 
//             insertStmt.setObject(i + 1, pgInterval);
// 
//             break;
//           case 14:
//             insertStmt.setBoolean(i + 1, rs.getBoolean(i + 1));
//             break;
//           case 15:
//             new PGmoney(rs.getString(i + 1));
//             break;
//           case 16:
//           case 17:
//             insertStmt.setObject(i + 1, rs.getObject(i + 1));
//             break;
//           case 18:
//           case 19:
//             insertStmt.setObject(i + 1, rs.getString(i + 1), 1111);
//             break;
//           case 20:
//             if ((column.getDataTypeString().equalsIgnoreCase("TSQUERY")) || (column.getDataTypeString().equalsIgnoreCase("TSVECTOR")) || (column.getDataTypeString().equalsIgnoreCase("TXID_SNAPSHOT")))
//             {
//               insertStmt.setObject(i + 1, rs.getObject(i + 1));
//             }
//             else insertStmt.setObject(i + 1, convertToPGObjectTypeFormat(rs.getObject(i + 1)), 1111);
// 
//             break;
//           case 21:
//             insertStmt.setObject(i + 1, rs.getString(i + 1), 1111);
//             break;
//           default:
//             throw new Exception("Invalid DataType");
//           }
//         }
//         insertStmt.addBatch();
//         j++;
// 
//         if (j % batchSize != 0)
//           continue;
//         try {
//           insertStmt.executeBatch();
//           lastBatchFailure = false;
//           Utility.getLogger().info("[" + table.getName() + "] " + ResourceHandler.getValue("INFO_MIGRATED_ROWS", new Object[] { Integer.valueOf(j) }));
//         }
//         catch (Exception ex)
//         {
//           Utility.getLogger().warn(ex.getMessage() + ", Skipping Batch");
// 
//           if (((ex instanceof SQLException)) && (((SQLException)ex).getNextException() != null)) {
//             Utility.getLogger().warn(((SQLException)ex).getNextException().getMessage());
//           }
// 
//           Utility.getLogger().error("Stack Trace:", ex);
//           MigrationToolkit.incrementFailureCount();
//           table.incrementBatchFailureCount();
//           lastBatchFailure = true;
//         }
//         insertStmt.clearBatch();
//         this.targetConn.commit();
// 
//         if (!lastBatchFailure) {
//           committedRowCount += batchSize;
//         }
// 
//         for (int i = 0; i < arrFis.length; i++) {
//           if (arrFis[i] != null) {
//             arrFis[i].close();
//             new File(Utility.getTempPath() + "mtk_blobdata" + "_" + fileNamePrefix + i).delete();
//             arrFis[i] = null;
//           }
// 
//           if (arrBis[i] != null) {
//             arrBis[i].close();
//             arrBis[i] = null;
//           }
// 
//         }
// 
//         for (int i = 0; i < arrBr.length; i++) {
//           if (arrBr[i] != null) {
//             arrBr[i].close();
//             new File(Utility.getTempPath() + "mtk_clobdata" + "_" + fileNamePrefix + i).delete();
//             arrBr[i] = null;
//           }
//         }
// 
//         fisIndex = 0;
//         bisIndex = 0;
//         brIndex = 0;
//       }
// 
//       int[] lastBatchCmdCount = null;
//       try
//       {
//         lastBatchCmdCount = insertStmt.executeBatch();
//         lastBatchFailure = false;
// 
//         if (lastBatchCmdCount.length > 0) {
//           committedRowCount += j % batchSize;
//           Utility.getLogger().info("[" + table.getName() + "] " + ResourceHandler.getValue("INFO_MIGRATED_ROWS", new Object[] { Long.valueOf(committedRowCount) }));
//         }
//       }
//       catch (Exception ex)
//       {
//         Utility.getLogger().warn(ex.getMessage() + ", Skipping Batch");
// 
//         if (((ex instanceof SQLException)) && (((SQLException)ex).getNextException() != null)) {
//           Utility.getLogger().warn(((SQLException)ex).getNextException().getMessage());
//         }
// 
//         Utility.getLogger().error("Stack Trace:", ex);
//         MigrationToolkit.incrementFailureCount();
//         table.incrementBatchFailureCount();
//         lastBatchFailure = true;
//       }
//       insertStmt.clearBatch();
//       this.targetConn.commit();
//     }
//     catch (SQLException sqle) {
//       this.targetConn.rollback();
//       throw (sqle.getNextException() != null ? sqle.getNextException() : sqle);
//     } catch (Exception ex) {
//       this.targetConn.rollback();
//       throw ex;
//     }
//     finally {
//       for (int i = 0; i < arrFis.length; i++) {
//         if (arrFis[i] != null) {
//           arrFis[i].close();
//           new File(Utility.getTempPath() + "mtk_blobdata" + "_" + fileNamePrefix + i).delete();
//         }
// 
//         if (arrBis[i] != null) {
//           arrBis[i].close();
//           arrBis[i] = null;
//         }
// 
//       }
// 
//       for (int i = 0; i < arrBr.length; i++) {
//         if (arrBr[i] != null) {
//           arrBr[i].close();
//           new File(Utility.getTempPath() + "mtk_clobdata" + "_" + fileNamePrefix + i).delete();
//         }
// 
//       }
// 
//       this.targetConn.getConnection().setAutoCommit(true);
// 
//       if ((((this.srcConn instanceof EnterpriseDBConnection)) || ((this.srcConn instanceof SRDBConnection))) &&
//         (_edbConn != null)) {
//         _edbConn.setAutoCommit(defaultAutoCommitMode);
//       }
// 
//       if (insertStmt != null) {
//         insertStmt.close();
//       }
// 
//       if (destStmt != null) {
//         destStmt.close();
//       }
// 
//       if (rs != null) {
//         rs.close();
//       }
// 
//       if (sourceStmt != null) {
//         sourceStmt.close();
//       }
//     }
//     return committedRowCount;
   }
 
   public long setTableDataInSafeMode(Table table, MTKConstants.DATABASE_TYPE sourceDBType, MTKConstants.DATABASE_TYPE targetDBType) throws Exception
   {
	return 0; // n/a
//     Statement insertStmt = null;
//     Statement sourceStmt = null;
//     Statement destStmt = null;
//     ResultSet rs = null;
//     StringBuffer insertColStr = new StringBuffer();
//     StringBuffer insertStr = new StringBuffer();
//     Connection _edbConn = null;
//     boolean defaultAutoCommitMode = false;
//     try
//     {
//       insertColStr.append("INSERT INTO ").append(table.getTargetSchemaQualifiedName()).append(" VALUES (");
// 
//       insertStmt = this.targetConn.getConnection().createStatement();
//       destStmt = this.targetConn.getConnection().createStatement();
//       destStmt.execute("TRUNCATE TABLE " + table.getTargetSchemaQualifiedName());
// 
//       sourceStmt = this.srcConn.getConnection().createStatement();
// 
//       if (((this.srcConn instanceof EnterpriseDBConnection)) || ((this.srcConn instanceof SRDBConnection))) {
//         _edbConn = this.srcConn.getConnection();
//         defaultAutoCommitMode = _edbConn.getAutoCommit();
//         _edbConn.setAutoCommit(false);
// 
//         sourceStmt.setFetchSize(100);
//       }
// 
//       rs = sourceStmt.executeQuery(table.getSelectSQL());
// 
//       int rowCount = 0;
//       while (rs.next()) {
//         insertStr.setLength(0);
//         insertStr.append(insertColStr);
// 
//         for (i = 0; i < table.getColumns().size(); i++) {
//           if (i > 0) {
//             insertStr.append(", ");
//           }
// 
//           if (rs.getObject(i + 1) == null) {
//             insertStr.append("null");
//           }
//           else {
//             switch (1.$SwitchMap$com$edb$schema$metadata$Column$DataType[table.getColumns().get(i).getDataType().ordinal()])
//             {
//             case 1:
//             case 2:
//             case 3:
//             case 4:
//             case 5:
//               String value = rs.getString(i + 1);
//               if (MigrationToolkit.replaceNullChar()) {
//                 value = value.replaceAll("", String.valueOf(MigrationToolkit.nullReplacementChar()));
//               }
//               insertStr.append("'").append(value).append("'");
//               break;
//             case 6:
//             case 7:
//             case 8:
//               insertStr.append(rs.getBigDecimal(i + 1));
//               break;
//             case 10:
//               insertStr.append("'").append(rs.getDate(i + 1)).append("'");
//               break;
//             case 22:
//               insertStr.append("'").append(rs.getTime(i + 1)).append("'");
//               break;
//             case 11:
//               insertStr.append("'").append(rs.getTimestamp(i + 1)).append("'");
//               break;
//             case 12:
//               insertStr.append("null");
//               break;
//             case 13:
//             case 18:
//               insertStr.append("'").append(rs.getString(i + 1)).append("'");
//               break;
//             case 9:
//             case 14:
//             case 15:
//             case 16:
//             case 17:
//             case 19:
//             case 20:
//             case 21:
//             default:
//               throw new Exception("Invalid DataType");
//             }
//           }
//         }
//         insertStr.append(")");
//         insertStmt.executeUpdate(insertStr.toString());
// 
//         rowCount++;
//       }
// 
//       i = rowCount;
//     }
//     finally
//     {
//       int i;
//       if ((((this.srcConn instanceof EnterpriseDBConnection)) || ((this.srcConn instanceof SRDBConnection))) &&
//         (_edbConn != null)) {
//         _edbConn.setAutoCommit(defaultAutoCommitMode);
//       }
// 
//       if (insertStmt != null) {
//         insertStmt.close();
//       }
// 
//       if (destStmt != null) {
//         destStmt.close();
//       }
// 
//       if (rs != null) {
//         rs.close();
//       }
// 
//       if (sourceStmt != null)
//         sourceStmt.close();
//     }
   }
 
   public static String[] convertToPGIntervalFormat(String intervalValue)
   {
     String[] arrInterval = { "0", "0", "0", "0", "0", "0" };
 
     if ((intervalValue.indexOf('-') >= 0) && (!intervalValue.contains(":"))) {
       String[] yearMonthParts = intervalValue.split("-");
       arrInterval[0] = yearMonthParts[0];
       arrInterval[1] = yearMonthParts[1];
     }
     else if (intervalValue.contains(":")) {
       String[] daySecondParts = intervalValue.split(":");
 
       arrInterval[2] = daySecondParts[0].split(" ")[0];
       arrInterval[3] = daySecondParts[0].split(" ")[1];
 
       if (daySecondParts[0].indexOf("-") >= 0) {
         daySecondParts[0] = daySecondParts[0].replaceAll("-", "");
         daySecondParts[1] = ("-" + daySecondParts[1]);
       }
       arrInterval[4] = daySecondParts[1];
       String sec = daySecondParts[2].substring(0, daySecondParts[2].indexOf("."));
       String miliSec = daySecondParts[2].substring(daySecondParts[2].indexOf(".") + 1);
       double roundedSeconds = 0.0D;
 
       if (miliSec.startsWith("-")) {
         roundedSeconds = Double.parseDouble("-." + miliSec.substring(1)) / 1000.0D;
         roundedSeconds = Double.parseDouble(sec) + roundedSeconds;
       } else {
         roundedSeconds = Double.parseDouble(daySecondParts[2]);
       }
 
       arrInterval[5] = String.valueOf(roundedSeconds);
     }
 
     return arrInterval;
   }
 
   private static PGInterval getPGIntervalObject(String intervalValue)
   {
     String[] arrInterval = convertToPGIntervalFormat(intervalValue);
     return new PGInterval(Integer.parseInt(arrInterval[0]), Integer.parseInt(arrInterval[1]), Integer.parseInt(arrInterval[2]), Integer.parseInt(arrInterval[3]), Integer.parseInt(arrInterval[4]), Double.parseDouble(arrInterval[5]));
   }
 
   public static String getPGIntervalString(String intervalValue)
   {
     String[] arrInterval = convertToPGIntervalFormat(intervalValue);
     return arrInterval[0] + " years " + arrInterval[1] + " month " + arrInterval[2] + " day " + arrInterval[3] + " hour " + arrInterval[4] + " mins " + arrInterval[5] + " secs";
   }
 
   public static String convertToPGObjectTypeFormat(Object objectValue)
     throws SQLException
   {
     if (objectValue == null) {
       return null;
     }
 
     Struct objStruct = (Struct)objectValue;
     Object[] objStructAttrs = objStruct.getAttributes();
     StringBuffer colValueStr = new StringBuffer("(");
 
     for (int index = 0; index < objStructAttrs.length; index++) {
       if (index > 0) {
         colValueStr.append(",");
       }
 
       if (objStructAttrs[index] == null)
       {
         continue;
       }
       if ((objStructAttrs[index] instanceof String))
         colValueStr.append("\"").append(objStructAttrs[index]).append("\"");
       else {
         colValueStr.append(objStructAttrs[index]);
       }
     }
 
     colValueStr.append(")");
     return colValueStr.toString();
   }
 }

/* 

 * 
 */